๐ซ Hydration Mismatch ๐ซ (1)2023. 6. 2.
์ด๋ฐ ์ ๋ฐ ์ด์ ๋ก ํด๋ผ์ด์ธํธ ์ํ๋ฅผ localStorage
๋ฑ์ persist ํ๊ณ ์์ ๊ฒฝ์ฐ server/client mismatch๊ฐ ๋ฐ์ํ ์ ๋ฐ์ ์๋๋ฐ ๊ทธ๋์ ์๋ฒ์์ ํ๋ฆฌ๋ ๋๊ฐ ์๋๊ฒ ํ๋ ค๋ฉด ์๋์ ๊ฐ์ ๋๋ฆฌ ๋ฒ์์ด ํ์.
useState
+useEffect
function Comp() { const storeState = useStoreState() ^^^^^^^^^^ 1) ์๊ฑธ ๊ทธ๋ฅ ์ฐ๋ฉด ๐ฃ ์ธ ๊ฒฝ์ฐ, const [state, setState] = React.useState() React.useEffect(()=>{ setState(storeState) },[]) // 2) ์ด๋ฐ ๋๋ฆฌ ๋ฒ์ ํ์ return <div>{state}</div> // 3) ์ด๋ฌ๋ฉด ํต๊ณผ
function Comp() { const storeState = useStoreState() ^^^^^^^^^^ 1) ์๊ฑธ ๊ทธ๋ฅ ์ฐ๋ฉด ๐ฃ ์ธ ๊ฒฝ์ฐ, const [state, setState] = React.useState() React.useEffect(()=>{ setState(storeState) },[]) // 2) ์ด๋ฐ ๋๋ฆฌ ๋ฒ์ ํ์ return <div>{state}</div> // 3) ์ด๋ฌ๋ฉด ํต๊ณผ
useMounted
+return null
// 0) ์ผ๋จ ์ด๋ฐ ๋๋ฆฌ ๋ฒ์์ ๋ง๋ค์ด๋๊ณ const useMounted = () => { const [m, sM] = React.useState(false) // ^^^^^ ๊ท์ฐฎ์์ ๋์ถฉ ์ React.useEffect(()=>{ sM(true) }, []) return m }
// 0) ์ผ๋จ ์ด๋ฐ ๋๋ฆฌ ๋ฒ์์ ๋ง๋ค์ด๋๊ณ const useMounted = () => { const [m, sM] = React.useState(false) // ^^^^^ ๊ท์ฐฎ์์ ๋์ถฉ ์ React.useEffect(()=>{ sM(true) }, []) return m }
function Comp() { const storeState = useStoreState() ^^^^^^^^^^ 1) ์๊ฑธ ๊ทธ๋ฅ ์ฐ๋ฉด ๐ฃ ์ธ ๊ฒฝ์ฐ, const mounted = useMounted() if (!mounted) return null // 2) ์ด๋ฌ๊ณ ๋์ return <div>{storeState}</div> // 3) ์ด๋ฌ๋ฉด ํต๊ณผ
function Comp() { const storeState = useStoreState() ^^^^^^^^^^ 1) ์๊ฑธ ๊ทธ๋ฅ ์ฐ๋ฉด ๐ฃ ์ธ ๊ฒฝ์ฐ, const mounted = useMounted() if (!mounted) return null // 2) ์ด๋ฌ๊ณ ๋์ return <div>{storeState}</div> // 3) ์ด๋ฌ๋ฉด ํต๊ณผ
next/dynamic
+{ ssr: false }
โ ์ด๊ฒ ๊ธฐ๋ถ์ด ์ ์ผ ๋ ๋์๋ฏํ์ง๋ง ์บ์น๊ฐ ํ๋ ์๋๋ฐ,const Comp = dynamic(() => import('path/to/comp'), { ssr: false }); // ์ ค ๊ฐ๋จ?
const Comp = dynamic(() => import('path/to/comp'), { ssr: false }); // ์ ค ๊ฐ๋จ?
Comp
๋ ๋ฌด์กฐ๊ฑดexport default
์ฌ์ผ ํจ.๋์const Comp = dynamic(() => import('path/to/comp').then(mod => mod.Comp), { ssr: false }) // ^^^^^^^^^^^^^^^ ์ด๋ฌ๋ฉด ๐ฃ
const Comp = dynamic(() => import('path/to/comp').then(mod => mod.Comp), { ssr: false }) // ^^^^^^^^^^^^^^^ ์ด๋ฌ๋ฉด ๐ฃ
loading
์ผ๋ก ์์คํ์ค ๊ฐ์ง๋ฅผ ๋ผ ์ ์์(...)๋ฌผ๋ก next ํ์ ์ด์ง๋ง์...const Comp = dynamic(() => import('path/to/comp'), { ssr: false, loading: () => <Sekeleton /> }); // ์ด ๊ฐ๋ฅ
const Comp = dynamic(() => import('path/to/comp'), { ssr: false, loading: () => <Sekeleton /> }); // ์ด ๊ฐ๋ฅ
์ด๊ฑฐ ๋ค ๋ณ๋ฃจ๊ณ ... ๋ก ์์ํ๋ ๊ธ์ ํ์ฐธ ์ฐ๊ณ ์์๋๋ฐ ๋ธ๋ผ์ฐ์ ๊บผ์ ธ์ ๋ ์๊ฐ...